import mysql.connector  
from mysql.connector import Error  
import threading  
from dbutils.pooled_db import PooledDB  
  
# 数据库连接配置  
db_config = {  
    'user': 'root',  
    'password': 'lcz19860109',  
    'host': 'localhost',  
    'database': 'dev10086',  
    'maxconnections': 10,  # 连接池最大连接数  
    'mincached': 2,        # 缓存中保持的最小空闲连接数  
    'maxcached': 5,        # 缓存中保持的最大空闲连接数  
    'maxshared': 5,        # 连接池中最多共享的连接数，0表示不共享  
    'blocking': True,      # 连接池中如果没有可用连接后，是否阻塞等待。True表示等待，False表示不等待然后报错  
    'maxusage': None,      # 一个连接最多可以被重复使用的次数，None表示无限制  
    'setsession': [],      # 开始会话前执行的命令列表。如：["set datestyle to 'iso', session"]  
    'ping': 0,             # ping MySQL服务端，检查是否服务可用。# 如：0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always  
    'host': 'localhost',  
    'port': 3306,  
    'charset': 'utf8',  
    'use_unicode': True  
}  
  
# 创建连接池  
db_pool = PooledDB(  
    creator=mysql.connector,  # 使用连接数据库的模块  
    # maxconnections=db_config['maxconnections'],  # 连接池允许的最大连接数，0和None表示不限制连接数  
    # mincached=db_config['mincached'],  # 初始化时，池中至少创建的空闲的连接，0表示不创建  
    # maxcached=db_config['maxcached'],  # 池中最多闲置的连接，0和None不限制  
    # maxshared=db_config['maxshared'],  # 池中最多共享的连接数量，0和None表示所有连接都不共享。PS: 无用，因为mysql和SQLite都是不支持并发执行的，所以此参数必填为0  
    # blocking=db_config['blocking'],  # 连接池中如果没有可用连接后，是否阻塞等待。True，等待；False，不等待然后报错  
    # maxusage=db_config['maxusage'],  # 一个连接最多可以被重复使用的次数，None表示无限制  
    # setsession=db_config['setsession'],  # 开始会话前执行的命令列表。如：["set datestyle to 'iso', session"]  
    # ping=db_config['ping'],  # ping MySQL服务端，检查是否服务可用。如：0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always  
    **db_config  # 其他参数使用**传入  
)  
  
# 使用锁来保护数据库操作  
lock = threading.Lock()  
def read_data_from_db(thread_id):  
    # 从连接池中获取连接  
    connection = db_pool.connection()  
    cursor = connection.cursor()  
  
    # 获取锁  
    lock.acquire()  
    try:  
        # 执行SQL查询  
        limit = 10  
        skip_rows = thread_id * limit  
        query = "SELECT * FROM data_hunqing LIMIT %s, %s"  
        cursor.execute(query, (skip_rows, limit))  
        records = cursor.fetchall()  
        print(f"Thread {thread_id}: Read data from database")  
        print(records)  
    except Error as e:  
        print(f"Error while reading data: {e}")  
    finally:  
        # 释放锁  
        lock.release()  
        # 关闭游标
  
# 创建多个线程来读取数据  
threads = []  
for i in range(10):  
    t = threading.Thread(target=read_data_from_db, args=(i,))  
    threads.append(t)
    
    t.start()  
  
# 等待所有线程完成  
for t in threads:  
    t.join()  
  
print("All threads finished.")